from flask import jsonify  # 导入 Flask 的 jsonify 函数，用于返回 JSON 格式的响应
from werkzeug.exceptions import HTTPException  # 导入 Werkzeug 提供的 HTTPException 类

def register_error_handlers(app):
    """
    注册 Flask 应用的错误处理程序。

    参数:
    app (Flask): Flask 应用实例。
    """

    # 注册处理 400 Bad Request 错误的自定义处理函数
    @app.errorhandler(400)
    def bad_request(error):
        """
        处理 400 Bad Request 错误。

        参数:
        error (HTTPException): 错误对象。

        返回:
        tuple: JSON 响应和状态码。
        """
        return jsonify({
            'error': 'Bad Request',  # 错误类型
            'message': error.description  # 错误描述
        }), 400

    # 注册处理 401 Unauthorized 错误的自定义处理函数
    @app.errorhandler(401)
    def unauthorized(error):
        """
        处理 401 Unauthorized 错误。

        参数:
        error (HTTPException): 错误对象。

        返回:
        tuple: JSON 响应和状态码。
        """
        return jsonify({
            'error': 'Unauthorized',  # 错误类型
            'message': error.description  # 错误描述
        }), 401

    # 注册处理 404 Not Found 错误的自定义处理函数
    @app.errorhandler(404)
    def not_found(error):
        """
        处理 404 Not Found 错误。

        参数:
        error (HTTPException): 错误对象。

        返回:
        tuple: JSON 响应和状态码。
        """
        return jsonify({
            'error': 'Not Found',  # 错误类型
            'message': error.description  # 错误描述
        }), 404

    # 注册处理 500 Internal Server Error 错误的自定义处理函数
    @app.errorhandler(500)
    def internal_error(error):
        """
        处理 500 Internal Server Error 错误。

        参数:
        error (HTTPException): 错误对象。

        返回:
        tuple: JSON 响应和状态码。
        """
        return jsonify({
            'error': 'Internal Server Error',  # 错误类型
            'message': 'An unexpected error occurred'  # 错误描述
        }), 500

    # 注册处理所有未捕获异常的自定义处理函数
    @app.errorhandler(Exception)
    def handle_exception(error):
        """
        处理所有未捕获的异常。

        参数:
        error (Exception): 异常对象。

        返回:
        tuple: JSON 响应和状态码。
        """
        if isinstance(error, HTTPException):
            # 如果是 HTTPException 的实例，则使用该异常对象，保持原来的错误信息和状态码
            return error
        
        # 否则，返回一个通用的 500 错误响应
        return jsonify({
            'error': 'Internal Server Error',  # 错误类型
            'message': str(error)  # 错误描述
        }), 500